맨위로가기

메모리 관리

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

메모리 관리는 운영체제의 핵심 기능으로, 여러 프로세스가 원활하게 실행될 수 있도록 메모리 공간을 할당하고 관리하는 것을 목표로 한다. 주요 기능으로는 릴로케이션, 보호, 공유, 논리 및 물리적 구성 등이 있다. 가상 메모리는 실제 하드웨어로부터 메모리 구성을 분리하여, 애플리케이션이 가상 주소를 통해 메모리에 접근하도록 하며, 메모리 보호, 공유 메모리, 주 기억 장치와 보조 기억 장치 간의 정보 이동 등을 관리한다. 메모리 관리 방식에는 수동 메모리 관리, 자동 메모리 관리 등이 있으며, 가비지 컬렉션, 참조 계수, 메모리 풀 등이 자동 메모리 관리의 주요 기법이다. 또한, Burroughs/Unisys MCP 시스템, OS/360 및 후속 시스템 등 다양한 운영체제에서 독자적인 메모리 관리 방식을 구현해왔다.

더 읽어볼만한 페이지

  • 메모리 관리 - 동적 메모리 할당
    동적 메모리 할당은 프로그램 실행 중 힙 영역에서 메모리 공간을 확보 및 해제하여 효율적인 메모리 관리와 유연성을 제공하는 기술로, 메모리 누수 방지 및 가비지 컬렉션 등의 고려 사항이 중요하며 C, C++, C++/CLI, C# 등에서 사용된다.
  • 메모리 관리 - 정적 변수
    정적 변수는 프로그램 실행 시간 동안 값을 유지하며, C 언어에서 `static` 키워드로 정의되어 함수 호출 간에 값을 유지하고, 객체 지향 프로그래밍에서 클래스의 모든 인스턴스에서 공유되는 클래스 변수로 사용된다.
  • 컴퓨터 구조 - PA-RISC
    PA-RISC는 휴렛 팩커드에서 개발한 RISC 기반 명령어 집합 아키텍처로, HP 서버 및 워크스테이션에 사용되었으며 대용량 L1 캐시와 SIMD 명령어 확장 등의 특징을 가졌으나 아이테니엄 아키텍처로의 전환으로 단종되었다.
  • 컴퓨터 구조 - 폰 노이만 구조
    폰 노이만 구조는 CPU, 주소 지정 메모리, 버스를 핵심 요소로 하는 컴퓨터 아키텍처로, 프로그램 내장 방식을 통해 명령어와 데이터를 동일한 기억 장치에 저장하고 순차적으로 실행하는 특징을 가진다.
  • 표시 이름과 문서 제목이 같은 위키공용분류 - 라우토카
    라우토카는 피지 비치레부섬 서부에 위치한 피지에서 두 번째로 큰 도시이자 서부 지방의 행정 중심지로, 사탕수수 산업이 발달하여 "설탕 도시"로 알려져 있으며, 인도에서 온 계약 노동자들의 거주와 미 해군 기지 건설의 역사를 가지고 있고, 피지 산업 생산의 상당 부분을 담당하는 주요 기관들이 위치해 있다.
  • 표시 이름과 문서 제목이 같은 위키공용분류 - 코코넛
    코코넛은 코코넛 야자나무의 열매로 식용 및 유지로 사용되며, 조리되지 않은 과육은 100g당 354kcal의 열량을 내는 다양한 영양 성분으로 구성되어 있고, 코코넛 파우더의 식이섬유는 대부분 불용성 식이섬유인 셀룰로오스이며, 태국 일부 지역에서는 코코넛 수확에 훈련된 원숭이를 이용하는 동물 학대 문제가 있다.
메모리 관리
기본 정보
종류자원 관리
관리 대상컴퓨터 메모리
관련 항목가상 메모리
페이지 테이블
TLB
메모리 단편화
메모리 누수
가비지 컬렉션
메모리 할당
정적 할당컴파일 시간에 결정됨
동적 할당런타임에 결정됨
목적
주요 목적사용 가능한 메모리를 효율적으로 할당
프로세스 간 메모리 충돌 방지
보안 강화
추가 고려 사항캐시 성능 최적화
NUMA 시스템 지원
기법
메모리 풀링미리 할당된 메모리 블록 재사용
스와핑메모리 내용을 디스크로 이동
페이지 교체 알고리즘LRU, FIFO, LFU 등
관련 주제
운영 체제운영 체제의 핵심 기능 중 하나
프로그래밍메모리 관리 방식에 따라 프로그램 성능에 영향
고려 사항
효율성메모리 사용량 최소화, 접근 속도 향상
안정성메모리 오류 방지, 시스템 다운 방지
보안보안 취약점 방지, 정보 보호

2. 메모리 관리의 목표 및 기능

운영 체제의 메모리 관리는 다음과 같은 목표를 가진다.


  • 여러 프로세스가 동시에 실행될 수 있도록 메모리 공간을 제공한다.
  • 시스템 사용자들을 위해 만족할 만한 수준의 성능을 제공한다.
  • 각 프로그램의 리소스를 보호한다.
  • 프로세스 사이에 있는 메모리 공간을 공유한다.
  • 프로그래머를 위해 되도록 메모리 공간의 어드레싱을 투명하게 한다.


메모리 관리의 주요 기능은 다음과 같다.

현재의 운영 체제에서는 메모리 관리의 하나로서 가상 메모리가 대표적이다. 가상 메모리 시스템은 프로세스가 사용하는 메모리 공간(주소 공간)을 물리 주소로부터 분리하여 프로세스 단위의 분리를 실현하는 동시에, 실질적으로 사용 가능한 메모리량을 증대시킨다. 가상 메모리 관리의 품질은 운영 체제 전체의 성능에 큰 영향을 미친다. 또한, 프로세스 간 통신의 일종인 공유 메모리는 다중 가상 공간에서의 프로세스 간 메모리 공유를 실현하는 기능이다.

3. 가상 메모리

현대 운영 체제(OS)는 메모리 관리의 한 방법으로 가상 메모리를 주로 사용한다.

가상 메모리 시스템은 프로세스가 사용하는 메모리 공간 (주소 공간)을 물리 주소로부터 분리하여 프로세스 단위의 분리를 실현하고, 실제 사용 가능한 메모리 양을 늘린다.[10] 가상 메모리 관리 품질은 운영 체제 전체 성능에 큰 영향을 미친다. 프로세스 간 통신의 일종인 공유 메모리는 여러 가상 공간에서 프로세스 간 메모리 공유를 가능하게 한다.

가상 메모리 시스템에서 운영 체제는 프로세스가 메모리에 접근하는 방식을 제한한다. 이 기능은 메모리 보호라고 하며, 한 프로그램의 악성 코드나 오작동하는 코드가 다른 프로그램의 작동을 방해하지 않도록 프로세스가 할당되지 않은 메모리를 읽거나 쓰는 것을 막는 데 사용된다.

3. 1. 가상 메모리 이전

가상 메모리 시스템은 간단히 말해, 메모리 관리 유닛(MMU)을 부착하거나 내장한 CPU가 필요하다. 일반적인 CPU에 전용 MMU가 내장되기 전까지는 뱅크 전환 등 메모리 관리(확장)가 이루어졌다.

MS-DOS에서는 '''메모리 매니저'''라고 불리는 프로그램이 개발되었다(뱅크 메모리, EMS, XMS 등). 이는 OS의 일부를 일반적인 위치에서 이동시켜, 애플리케이션이 더 많은 메모리를 사용할 수 있도록 하는 것이다.

4. 수동 메모리 관리

수동 메모리 관리는 힙(heap) 또는 자유 저장소(free store)라고 하는 메모리 풀에서 메모리 블록을 할당하여 메모리 요청을 처리하는 방식이다. C 언어에서는 `malloc` 함수를 사용하여 힙에서 메모리를 할당하고, `free` 함수를 사용하여 할당된 메모리를 해제한다.[3]

하지만 이러한 수동 메모리 관리 방식은 몇 가지 문제를 야기할 수 있다. 예를 들어, 할당된 메모리 블록 사이에 작은 틈이 생겨 메모리 요청에 사용할 수 없는 외부 단편화가 발생할 수 있다.

외부 단편화
또한, 할당자의 메타데이터가 작은 할당의 크기를 부풀릴 수 있으며, 이는 청킹으로 관리된다. 메모리 관리 시스템은 메모리가 "손실"되지 않도록, 즉 메모리 누수가 발생하지 않도록 미결정 할당을 추적해야 한다.

4. 1. 효율성

동적으로 메모리를 할당하는 특정 알고리즘 구현은 성능에 상당한 영향을 미칠 수 있다. 1994년 디지털 이큅먼트 코퍼레이션에서 수행한 연구는 다양한 할당자에 대한 계산 오버헤드를 보여준다. 단일 메모리 슬롯을 할당하는 데 필요한 평균 명령어 경로 길이는 52였다(다양한 소프트웨어에서 명령어 레벨 프로파일링 (컴퓨터 프로그래밍)으로 측정).[4]

4. 2. 구현 방식

메모리는 일반적으로 포인터 참조를 통해 간접적으로 접근하는데, 이는 할당 위치를 미리 알 수 없기 때문이다. 메모리 영역을 구성하고 청크(덩어리)를 할당 및 해제하는 데 사용되는 특정 알고리즘은 커널과 상호 연관되어 있으며, 다음과 같은 방법을 사용할 수 있다.[1]

4. 2. 1. 고정 크기 블록 할당 (Fixed-size blocks allocation)

메모리 풀이라고도 하는 고정 크기 블록 할당은 모두 같은 크기의 고정된 메모리 블록 목록을 사용한다. 이 방식은 간단한 임베디드 시스템에는 적합하지만, 특히 긴 메모리 주소에서 단편화 문제를 겪을 수 있다. 그러나 오버헤드가 상당히 적어 비디오 게임과 같이 할당과 해제가 빈번한 객체의 성능을 크게 향상시킬 수 있다.[1]

4. 2. 2. 버디 블록 (Buddy blocks)

이 시스템에서 메모리는 단일 풀 대신 여러 개의 메모리 풀로 할당되는데, 각 풀은 특정 2의 거듭제곱 크기의 메모리 블록 또는 다른 편리한 크기로 진행되는 블록을 나타낸다. 특정 크기의 모든 블록은 정렬된 연결 목록 또는 트리 자료구조에 유지되며, 할당 중에 생성된 모든 새 블록은 나중에 사용하기 위해 해당 메모리 풀에 추가된다. 사용 가능한 것보다 작은 크기가 요청되면 사용 가능한 가장 작은 크기가 선택되고 분할된다. 결과 부분 중 하나가 선택되고 요청이 완료될 때까지 프로세스가 반복된다. 블록이 할당되면 할당자는 블록을 불필요하게 분할하는 것을 피하기 위해 충분히 큰 가장 작은 블록부터 시작한다. 블록이 해제되면 버디와 비교된다. 둘 다 비어 있으면 결합되어 해당 더 큰 크기의 버디 블록 목록에 배치된다.

4. 2. 3. 슬래브 할당 (Slab allocation)

이 메모리 할당 메커니즘은 특정 유형 또는 크기의 객체를 담을 수 있도록 메모리 청크(슬래브)를 미리 할당한다.[5] 이러한 청크는 캐시라고 불리며, 할당자는 사용 가능한 캐시 슬롯 목록만 추적하면 된다. 객체를 생성하면 사용 가능한 캐시 슬롯 중 하나를 사용하고, 객체를 소멸시키면 슬롯을 사용 가능한 캐시 슬롯 목록에 다시 추가한다. 이 기술은 메모리 단편화를 완화하며, 사용 가능한 슬롯이면 충분하므로 적절한 메모리 부분을 검색할 필요가 없어 효율적이다.

4. 2. 4. 스택 할당 (Stack allocation)

유닉스 계열 시스템과 마이크로소프트 윈도우는 `malloc`과 유사한 방식으로 스택 메모리를 동적으로 할당하는 `alloca`라는 함수를 구현한다. 컴파일러는 일반적으로 이를 스택 포인터를 조작하는 인라인 명령어로 변환한다.[6] `alloca`를 호출한 함수가 반환될 때 할당된 메모리가 자동으로 해제되므로 수동으로 메모리를 해제할 필요는 없지만, 오버플로우의 위험이 있다. alloca는 많은 시스템에서 발견되지만 POSIX 또는 C 표준에는 없는 ''임시변통'' 확장이며, 스택 오버플로우 발생 시 동작이 정의되지 않는다.

마이크로소프트 윈도우에는 오류를 보고하는 `_malloca`라는 보다 안전한 버전의 alloca가 존재한다. 이는 `_freea`를 사용해야 한다.[7] gnulib는 유사한 인터페이스를 제공하지만, 오버플로우 시 SEH 예외를 발생시키는 대신, 과도한 크기가 감지되면 malloc으로 위임한다.[8] glibc에서 `alloca_account`를 사용하는 경우와 같이 수동 계정 및 크기 확인을 사용하여 유사한 기능을 에뮬레이션할 수 있다.[9]

5. 자동 메모리 관리

응용 프로그램에서 메모리를 적절하게 관리하는 것은 어려운 문제이며, 이를 처리하기 위한 다양한 전략들이 고안되었다.

5. 1. 호출 스택 변수 자동 관리

대부분의 프로그래밍 언어 구현에서, 프로그램의 런타임 환경은 하위 루틴이 호출될 때 호출 스택에서 비정적 지역 변수(자동 변수)에 대한 메모리를 자동으로 할당하고, 하위 루틴이 종료될 때 해당 메모리를 자동으로 해제한다. 특수한 선언을 통해 지역 변수가 프로시저 호출 간에 값을 유지하거나 다른 하위 루틴에서 지역 변수에 접근할 수 있도록 할 수 있다. 지역 변수의 자동 할당은 사용 가능한 메모리에 의해 제한되는 깊이까지 재귀를 가능하게 한다.[1]

5. 2. 가비지 컬렉션 (Garbage collection)

가비지 컬렉션은 프로그램에서 더 이상 사용할 수 없는 객체에 할당된 메모리를 자동으로 감지하고, 할당된 해당 메모리를 사용 가능한 메모리 풀로 반환하는 전략이다.[1] 이 방법은 프로그래머가 프로그램 내에서 메모리 요청과 메모리 해제를 명시적으로 코딩하는 "수동" 메모리 관리와 대조된다.[1] 자동 가비지 컬렉션은 프로그래머의 작업량을 줄이고 특정 종류의 메모리 할당 버그를 방지하는 장점이 있지만, 가비지 컬렉션 자체적으로 메모리 자원을 필요로 하며, 프로세서 시간을 두고 응용 프로그램과 경쟁할 수 있다.[1]

가비지 컬렉션

5. 3. 참조 계수 (Reference counting)

참조 계수는 메모리에 대한 독립적인 포인터가 얼마나 많은지를 나타내는 카운터를 유지하여 프로그램에서 더 이상 사용할 수 없는 메모리를 감지하는 전략이다. 새로운 포인터가 메모리 조각을 가리킬 때마다 프로그래머는 카운터를 증가시켜야 한다. 포인터가 가리키는 위치를 변경하거나, 더 이상 어떤 영역도 가리키지 않거나, 자체가 해제된 경우 카운터를 감소시켜야 한다. 카운터가 0으로 떨어지면 해당 메모리는 사용되지 않은 것으로 간주하고 해제해야 한다. 일부 참조 계수 시스템은 프로그래머의 참여를 요구하고, 일부는 컴파일러에 의해 자동으로 구현된다. 참조 계수의 단점은 순환 참조가 발생하여 메모리 누수가 발생할 수 있다는 것이다. 이는 "약한 참조"(참조 계수에 참여하지 않지만 가리키는 영역이 더 이상 유효하지 않을 때 알림을 받는 참조)의 개념을 추가하거나 참조 계수와 가비지 컬렉션을 함께 결합하여 완화할 수 있다.

5. 4. 메모리 풀 (Memory pools)

메모리 풀은 애플리케이션의 상태(예: 요청 또는 트랜잭션의 생명 주기)를 기반으로 메모리를 자동으로 해제하는 기술이다. 많은 애플리케이션은 메모리 할당을 생성하는 큰 코드 덩어리를 실행하지만, 해당 덩어리가 더 이상 유효하지 않은 실행 지점이 있다는 점을 이용한다. 예를 들어, 웹 서비스에서는 각 요청 후 해당 요청 실행 중에 할당된 메모리가 더 이상 필요하지 않다. 따라서 현재 메모리가 참조되고 있는지 여부를 추적하는 대신, 메모리는 관련 요청 또는 생명 주기 단계에 따라 할당된다. 해당 요청 또는 단계가 끝나면 관련된 모든 메모리가 한꺼번에 해제된다.[1]

가비지 컬렉션

6. 가상 메모리 시스템

가상 메모리는 메모리 구성을 실제 하드웨어로부터 분리하는 방법이다. 애플리케이션은 ''가상 주소''를 통해 메모리에서 작동한다. 애플리케이션이 특정 가상 메모리 주소에 접근하려는 각 시도는 가상 메모리 주소를 실제 ''물리 주소''로 변환하는 결과를 낳는다.[10] 이러한 방식으로 가상 메모리를 추가하면 메모리 시스템 및 접근 방식에 대한 세분화된 제어가 가능해진다.

가상 메모리 시스템에서 운영 체제는 프로세스가 메모리에 접근하는 방식을 제한한다. 이 기능은 메모리 보호라고 하며, 한 프로그램의 악성 또는 오작동 코드가 다른 프로그램의 작동을 방해하는 것을 막기 위해 프로세스가 할당되지 않은 메모리를 읽거나 쓰는 것을 금지하는 데 사용될 수 있다.

특정 프로세스에 할당된 메모리는 일반적으로 격리되어 있지만, 프로세스는 때때로 정보를 공유할 수 있어야 한다. 공유 메모리는 프로세스 간 통신을 위한 가장 빠른 기술 중 하나이다.

메모리는 일반적으로 접근 속도에 따라 주 기억 장치와 보조 기억 장치로 분류된다. 메모리 관리 시스템은 다른 작업과 함께 이러한 두 메모리 계층 간의 정보 이동도 처리한다.

7. Burroughs/Unisys MCP 시스템의 메모리 관리

Burroughs는 가상 메모리를 최초로 상용화한 기업 중 하나였다. B5000 시스템 설계와 가상 메모리를 처음부터 통합하여(1961년) 별도의 메모리 관리 장치(MMU)가 필요하지 않았다.[11]

메모리 서브 시스템은 메모리 블록에 대한 논리적 요청을 사용 가능한 세그먼트 목록에서 찾을 수 있는 메모리(세그먼트)의 물리적 부분에 매핑한다. 할당된 각 블록은 세그먼트 설명자[12]를 통해 관리되며, 세그먼트 설명자는 주소, 길이, 머신 유형, 블록이 주 메모리에 있는지 또는 설명자에 제공된 주소에서 로드해야 하는지를 나타내는 p-비트 또는 '존재' 비트를 포함한 세그먼트에 대한 관련 메타데이터를 포함하는 특수 제어 워드이다.

설명자는 연산이 참조된 블록을 오버플로우하거나 언더플로우할 수 없도록(일반적으로 버퍼 오버플로우라고 함) 메모리 안전 및 보안을 제공하는 데 필수적이다.

8. OS/360 및 후속 시스템의 메모리 관리

IBM System/360(IBM System/360)은 가상 메모리를 지원하지 않는다(Model 67영어 제외). 작업의 메모리 격리는 선택적으로 보호 키를 사용하여 수행되며, 각 작업에 대해 서로 다른 키(감독 프로그램의 경우 0, 1~15)를 할당한다. OS/360의 메모리 관리는 감독자 기능이다. 메모리는 `GETMAIN` 매크로를 사용하여 요청하고 `FREEMAIN` 매크로를 사용하여 해제하며, 이는 감독자(SVC)를 호출하여 해당 작업을 수행한다.

OS/360에서 세부 사항은 시스템이 생성되는 방식에 따라 다르다. 예를 들어, PCP, MFT, MVT가 있다.

OS/360 MVT에서 작업의 ''영역'' 또는 공유 ''시스템 큐 영역''(SQA) 내의 하위 할당은 보호 키로 보호되는 영역의 크기인 2KB의 배수인 ''서브 풀''을 기반으로 한다. 서브 풀은 0~255로 번호가 매겨진다. 영역 내에서 서브 풀에는 작업의 스토리지 보호 또는 감독자 키인 키 0이 할당된다. 서브 풀 0~127은 작업의 키를 받는다. 처음에 서브 풀 0만 생성되며, 다른 서브 풀이 메모리 요청에 지정되지 않는 한 모든 사용자 스토리지 요청은 서브 풀 0에서 충족된다. 서브 풀 250~255는 작업 대신 감독자의 메모리 요청에 의해 생성된다. 이들 대부분은 키 0이 할당되지만, 일부는 작업의 키를 받는다. 서브 풀 번호는 MFT에서도 관련이 있지만, 세부 사항은 훨씬 간단하다. MFT는 동적 영역 대신 연산자가 재정의할 수 있는 고정 ''파티션''을 사용하며 PCP는 단일 파티션만 있다.

각 서브 풀은 서브 풀 내에서 할당된 메모리 블록과 사용 가능한 메모리 블록을 식별하는 제어 블록 목록에 의해 매핑된다. 메모리는 충분한 크기의 사용 가능한 영역을 찾거나, 작업의 영역 크기까지 서브 풀에 추가 블록을 할당하여 할당된다. 할당된 메모리 영역의 전부 또는 일부를 해제할 수 있다.[13]

OS/VS1에 대한 세부 사항은 MFT 및 MVT의 세부 사항과 유사하며 OS/VS2에 대한 세부 사항은 MVT와 유사하지만 페이지 크기는 4KiB이다. OS/VS1 및 OS/VS2 모두에서 공유 ''시스템 큐 영역''(SQA)은 페이징할 수 없다.

MVS에서 주소 공간[14]은 추가적인 페이징 가능한 공유 영역인 ''공통 스토리지 영역''(CSA)과 페이징할 수 없는 ''로컬 시스템 큐 영역''(LSQA) 및 페이징 가능한 ''시스템 작업 영역''(SWA)의 두 개의 추가적인 개인 영역을 포함한다. 또한, 스토리지 키 0~7은 모두 권한 있는 코드에서 사용하도록 예약되어 있다.

참조

[1] 서적 System Operations Guid Unisys
[2] 서적 IBM Operating System/360 Concepts and Facilities http://bitsavers.org[...] IBM Corporation 2019-04-03
[3] 웹사이트 Inside Memory Management https://developer.ib[...]
[4] 저널 Memory allocation costs in large C and C++ programs http://www.eecs.nort[...] 1994-06-01
[5] 서적 Operating system concepts Wiley
[6] man
[7] 웹사이트 _malloca https://docs.microso[...] 2022-10-26
[8] 웹사이트 gnulib/malloca.h https://github.com/c[...] 2019-11-24
[9] 웹사이트 glibc/include/alloca.h https://github.com/b[...] Beren Minor's Mirrors 2019-11-23
[10] 서적 Modern Operating Systems Prentice-Hall 1992
[11] 웹사이트 Stories About the B5000 and People Who Were There https://archive.comp[...]
[12] 서적 The Descriptor http://www.bitsavers[...] Burroughs Corporation 1961-02-01
[13] 서적 Program Logic: IBM System/360 Operating System MVT Supervisor http://bitsavers.org[...] IBM Corporation 2019-04-03
[14] 서적 Introduction to OS/VS2 Release 2 http://bitsavers.org[...] IBM 2024-07-15
[15] 저널 Tech Talk: Placing the IBM/Microsoft XMS Spec Into Perspective http://books.google.[...] 1988-08-15



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com